package com.gzy.cs5.service;

import com.gzy.cs5.Repository.OrderRepository;
import com.gzy.cs5.exception.BusinessException;
import com.gzy.cs5.lang.OrderStatus;
import com.gzy.cs5.model.Item;
import com.gzy.cs5.model.Order;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 抽象基类，实现了 OrderService 接口的基本功能。
 * 提供订单创建、取消、状态更新等抽象方法，具体实现由子类完成。
 */
public abstract class BaseOrderService implements OrderService {

    protected OrderRepository repository; // 订单存储库，用于持久化订单数据

    /**
     * 构造函数，初始化订单存储库。
     *
     * @param repository 订单存储库实例
     */
    public BaseOrderService(OrderRepository repository) {
        this.repository = repository;
    }

    protected BaseOrderService() {
    }

    /**
     * 创建订单，默认使用当前时间作为订单创建时间。
     *
     * @param items 商品列表
     * @param isVIP 是否为 VIP 用户
     * @return 创建的订单对象
     * @throws BusinessException 如果商品列表无效或库存不足，则抛出业务异常
     */
    @Override
    public Order createOrder(List<Item> items, boolean isVIP) throws BusinessException {
        return createOrder(items, isVIP, LocalDateTime.now());
    }

    /**
     * 创建订单，允许指定订单创建时间（主要用于测试场景）。
     *
     * @param items       商品列表
     * @param isVIP       是否为 VIP 用户
     * @param currentTime 指定的订单创建时间
     * @return 创建的订单对象
     * @throws BusinessException 如果商品列表无效或库存不足，则抛出业务异常
     */
    @Override
    public abstract Order createOrder(List<Item> items, boolean isVIP, LocalDateTime currentTime) throws BusinessException;

    /**
     * 取消订单，仅允许在订单创建后 30 分钟内取消。
     *
     * @param orderId     订单 ID
     * @param currentTime 当前时间
     * @throws BusinessException 如果订单不存在、状态无效或已超过取消时限，则抛出业务异常
     */
    @Override
    public abstract void cancelOrder(String orderId, LocalDateTime currentTime) throws BusinessException;

    /**
     * 获取所有订单。
     *
     * @return 订单列表
     */
    @Override
    public abstract List<Order> getAllOrders();

    /**
     * 根据订单 ID 获取订单。
     *
     * @param orderId 订单 ID
     * @return 对应的订单对象
     */
    @Override
    public abstract Order getOrderById(String orderId) throws BusinessException;

    /**
     * 更新订单状态。
     *
     * @param orderId 订单 ID
     * @param status  新的状态
     * @throws BusinessException 如果订单不存在或状态更新无效，则抛出业务异常
     */
    @Override
    public abstract void updateOrderStatus(String orderId, OrderStatus status) throws BusinessException;
}
